import QtQuick 1.1
import "Components"
import "js/WebAccess/AmazonProduct.js" as AmazonProduct
import "js/WebAccess/HttpAccess.js" as HttpAccess
import "js/Util/Database.js" as Database
import "js/WebAccess/TwitterAPI.js" as TwitterAPI
import "js/Util/Util.js" as Util
import "js/Values.js" as Values

Rectangle {
    id: _root
    width: 680
    height: 680

    property int fontSize: 10
    property color clearBtnFontColor: "#dddddd"

    // 処理待ちカウンタ
    property int waitSearchCount: 2        // 検索のカウンタ
    property int waitCommandCount: 5        // コマンド処理のカウンタ
    property int waitUserCheckCount: 15     // ユーザーチェック
    property int waitTweetPing: 10          // 動作確認つぶやき

    // 処理中データのリスト
//    property variant keywordList: null
//    property int Values.keywordCurrentIndex: -1
    property date keywordStartTime: new Date(1978,1,1,1,1,1)


    Timer{
        interval: 1000 * 60;
        running: true;
        repeat: true
        triggeredOnStart: false//true
        onTriggered: {
            // １分おきに処理することがあるか確認していく
            // 重なったら次の１分後
            if(waitSearchCount < 0){
                // 検索処理開始
                Util.outputLog(_model, "Start Search", false);
                loadKeyword();
                requestSearch();

                // 処理したらカウンタ復活
                waitSearchCount = 165;

            }else if(waitCommandCount < 0){
                // コマンド処理
                Util.outputLog(_model, "Start Command ope", false);
                recvCommand(0);

                // 処理したらカウンタ復活
                waitCommandCount = 5;

            }else if(waitUserCheckCount < 0){
                // ユーザー処理
                Util.outputLog(_model, "Start UserCheck ope", false);
                recvCommand(1);

                // 処理したらカウンタ復活
                waitUserCheckCount = 15;

            }else if(waitTweetPing < 0){
                // 動作確認つぶやき
                Util.outputLog(_model, "Start TweetPing ope", false);
                recvCommand(2);

                waitTweetPing = 60;
            }else{
            }

            // カウントダウン
            waitSearchCount--;
            waitCommandCount--;
            waitUserCheckCount--;
            waitTweetPing--;
        }
    }

    //////////////////////////////////////////////
    // Amazonへの商品検索系
    //////////////////////////////////////////////

    // リクエスト用のデータ作成
    function loadKeyword(){
        var next_time = new Date();

        if((next_time - keywordStartTime) > 3600000){
            // １時間しないと次の処理はできない
            Values.keywordList = Database.readKeyword("");
            Values.keywordCurrentIndex = 0;
            keywordStartTime = new Date();
        }
    }

    // Amazonへリクエスト
    function requestSearch(){
        Util.outputDebugString("len=" + Values.keywordList.length + ",index=" + Values.keywordCurrentIndex)
        if(Values.keywordCurrentIndex < 0){
            Values.keywordCurrentIndex = -1;
        }else if(Values.keywordList.length <= Values.keywordCurrentIndex){
            Values.keywordCurrentIndex = -1;
        }else if(Values.keywordList.length === 0){
            Values.keywordCurrentIndex = -1;
        }else{
            var item = Values.keywordList[Values.keywordCurrentIndex++];

            var url = AmazonProduct.getSignedURL(item.keyword, item.category, item.page_num);
            Util.outputDebugString("------- START --------");
            Util.outputDebugString("keyword = " + item.keyword);
            Util.outputDebugString(url);
            HttpAccess.requestHttpEx("", "GET", url, true
                                   , responseSearch
                                   , item.user_id);
        }
    }


    // Amazonへのアクセスの応答
    function responseSearch(object, param){
        var xml = object.responseText;

        Util.outputDebugString("search response:" + _xmlListModel.status + "," + param + "," + xml.substring(0,200));

        if(xml.length === 0){
            Util.outputDebugString("return null");
            requestSearch();
        }else{
            _xmlListModel.user_id = param;
            _xmlListModel.xml = xml;
        }
    }


    // xmlパーサー
    property variant __xmlListModel: XmlListModel {
//    XmlListModel {
        id: _xmlListModel

        property string user_id: ""

        namespaceDeclarations: "declare default element namespace 'http://webservices.amazon.com/AWSECommerceService/2011-08-01';"
        query: "/ItemSearchResponse/Items/Item"
        XmlRole { name: "_asin"; query: "ASIN/string()"; isKey: true}
        XmlRole { name: "_detail_url"; query: "DetailPageURL/string()"; }
        XmlRole { name: "_title"; query: "ItemAttributes/Title/string()"; }
        XmlRole { name: "_release_date"; query: "ItemAttributes/ReleaseDate/string()"; }
        XmlRole { name: "_product_group"; query: "ItemAttributes/ProductGroup/string()"; }
        XmlRole { name: "_publisher"; query: "ItemAttributes/Publisher/string()"; }

        //追加
        function appendItem(index, count){
            for(var i=0; i<count; i++){
                var item = get(i);

                Util.outputDebugString(i + ":asin=" + item["_asin"]);
                Util.outputDebugString(i + ":asin=" + item["_title"]);
                Util.outputDebugString(i + ":url=" + item["_detail_url"]);
            }
        }

        onItemsInserted: {
            var items = [];
            var added = false;

            for(var i=0; i<count; i++){
                if(get(i)["_asin"].length > 0){
                    items.push(get(i));
                    added = true;
                }
            }

            if(added){
                // コピーし終わってるので消す
                xml = "<?xml version=\"1.0\" ?>"
                        + "<ItemSearchResponse xmlns=\"http://webservices.amazon.com/AWSECommerceService/2009-07-01\">"
                        + "<Items><Item>"
                        + "<ASIN /><DetailPageURL />"
                        + "<ItemAttributes><ReleaseDate /><ProductGroup /><Publisher /></ItemAttributes>"
                        + "</Item></Items>"
                        + "</ItemSearchResponse>";

                // 処理スレッド開始
                _thread.sendMessage({"dest_model": _listModel
                                        ,"src_obj": items
                                        , "user_id": user_id
                                    });
            }else{
                Util.outputDebugString("none added item");
//                requestSearch();
            }
        }
    }

    // スレッド用エレメント
    WorkerScript {
        id: _thread
        source: "./js/SearchScript.js"
        // Workersuレッドからの通信イベント
        onMessage: {
            Util.outputDebugString("finish thread:" + messageObject.result);

            // amazonへアクセス
            if(messageObject.result){
                if(messageObject.item.length >= 10){
                    //2ページ目の検索をキューに登録
                    //ただしpage_numが登録されて無いか、2より小さい時
                    //user_id, category, keyword, update_at
                    var item = Values.keywordList[Values.keywordCurrentIndex-1];
                    if(item.page_num === undefined){
                        item.page_num = 1;
                    }
                    if(item.page_num < 3){
                        item.page_num++;
                        Values.keywordList.push(item);
//                        var list = keywordList;
//                        list.push(item);
//                        keywordList = list;

                        Util.outputDebugString("push page(" + item.page_num + "):" + item.user_id + "," + item.keyword);
                    }else{
                        Util.outputDebugString("Don\'t push page(" + item.page_num + "):" + item.user_id);
                    }
                }
                //次をアクセス
                requestSearch();
            }
        }
    }


    //////////////////////////////////////////////
    // コマンド処理系
    //////////////////////////////////////////////
    function recvCommand(command_type){
        if(!TwitterAPI.checkAuthInfo()){
            Util.outputDebugString("Don't twitter auth info");
        }else{
            // 処理スレッド開始
            _threadCommand.sendMessage({"dest_model": _listModel
                                    , "command_type": command_type
                                });
        }
    }

    WorkerScript {
        id: _threadCommand
        source: "./js/CommandScript.js"
        // Workerスレッドからの通信イベント
        onMessage: {
            Util.outputDebugString("finish command thread:" + messageObject.result);
        }
    }





    Column{
        id: _btn
        width: _root.width
        spacing: 4

        Row{
            spacing: 4
            // 検索開始
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Search"

                onClicked: {
                    Util.outputDebugString("search");
                    // キーワドロード
                    loadKeyword();
                    // amazonへアクセス
                    requestSearch();

                }
            }

            // コマンド受付
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Command"
                onClicked: {
                    Util.outputDebugString("command");

                    recvCommand(0);
                }
            }

            // フォロー処理
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "User check"
                onClicked: {
                    Util.outputDebugString("command:user check");

                    recvCommand(1);
                }
            }

            // つぶやく
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Tweet"
                onClicked: {
                    Util.outputDebugString("command:tweet");

                    recvCommand(2);
                }
            }

        }

        // キーワード登録
        Row{
            spacing: 4

            // キーワード
            Text{
                anchors.verticalCenter: parent.verticalCenter
                text: "keyword:"
            }
            TextBox{
                width: _root.width / parent.children.length
                id: _keyword
            }
            // カテゴリ
            Text{
                anchors.verticalCenter: parent.verticalCenter
                text: "category:"
            }
            TextBox{
                id: _category
                width: _root.width / parent.children.length
            }

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Add keyword(category)"
                onClicked: {
                    Util.outputDebugString("add");

                    if(_keyword.text.length > 0 && _userId.text.length > 0){
                        var user_id = _userId.text;
                        var category = "All";
                        var user= Database.readUserInfo(user_id);
                        if(_category.text.length > 0){
                            category = _category.text;
                        }
                        if(Database.saveKeyword(user_id, category, _keyword.text, user[0].item_count) === 0){
                            // exist
                            Util.outputLog(_model, "exist keyword:" + user_id + "," + category
                                           + "," + _keyword.text, false);
                        }else{
                            // add
                            Util.outputLog(_model, "add keyword:" + user_id
                                           + "," + category + "," + _keyword.text, false);
                        }
                    }
                }
            }
        }

        // 各種操作
        Row{
            spacing: 4

            Text{
                anchors.verticalCenter: parent.verticalCenter
                text: "user id:"
            }

            TextBox{
                id: _userId
                width: _root.width / parent.children.length
            }

            Text{
                anchors.verticalCenter: parent.verticalCenter
                text: "value:"
            }

            TextBox{
                id: _tempValue
                width: _root.width / parent.children.length
            }

            // キーワード表示
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Show keyword"
                onClicked: {
                    if(_userId.text.length > 0){
                        Util.outputDebugString("show keyword");

                        var data = Database.readKeyword(_userId.text);
                        for(var i=0; i<data.length; i++){
                            var item = data[i];
                            Util.outputLog(_model, "show category[" + i + "]:" + item.user_id
                                           + "," + item.category + "," + item.keyword
                                           , false);
                        }
                    }
                }
            }
            // キーワード削除
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "clear keyword"
                onClicked: {
                    if(_userId.text.length > 0){
                        Util.outputDebugString("clear keyword");

                        var data = Database.clearKeyword(_userId.text);
                        Util.outputLog(_model, "clear keyword:" + _userId.text, false);
                    }
                }
            }

            // ユーザー表示
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Show users"
                onClicked: {
                    Util.outputDebugString("show users");

                    var users = Database.readUserList();
                    for(var i=0; i<users.length; i++){
                        Util.outputLog(_model, "show users[" + i + "] : " + users[i].user_id
                               + ", item_count=" + users[i].item_count, false);
                    }
                }
            }
            // 登録制限アップデート
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Update limit"
                onClicked: {
                    Util.outputDebugString("update limit");

                    var user_id = _userId.text;
                    var limit = _tempValue.text;
                    if(user_id.length === 0 && limit < 5){
                        // ng
                        Util.outputLog(_model, "please input user info");
                    }else if(Database.updateUserInfo(user_id, limit) === 0){
                        // fail
                        Util.outputLog(_model, "fail update limit", false);
                    }else{
                        // ok
                        Util.outputLog(_model, "update " + user_id + "'s limit to " + limit, false);
                    }
                }
            }
            // ユーザーを削除
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Remove user"
                onClicked: {
                    if(_userId.text.length > 0){
                        Util.outputDebugString("remove user");

                        Database.removeUser(_userId.text);
                        Util.outputLog(_model, "remove user : " + _userId.text, false);
                    }
                }
            }

        }

        // 各種操作２段目
        Row{
            spacing: 4


            // 履歴の表示
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Show history"
                onClicked: {
                    if(_userId.text.length > 0){
                        Util.outputDebugString("show history");

                        var data = Database.readHistory(_userId.text);
                        for(var i=0; i<data.length; i++){
                            var item = data[i];
                            Util.outputLog(_model, "show history[" + i + "]:" + item.user_id
                                           + "," + item.asin, false);
                        }
                    }
                }
            }

            // 履歴のクリア
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Clear history"
                onClicked: {
                    if(_userId.text.length > 0){
                        Util.outputDebugString("clear history");

                        Database.clearHistory(_userId.text);
                        Util.outputLog(_model, "clear history:" + _userId.text, false);
                    }
                }
            }

            // コマンド履歴の表示
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Show Cmd history"
                onClicked: {
                    if(_userId.text.length > 0){
                        Util.outputDebugString("show command history");

                        var data = Database.readCommandHistory(_userId.text);
                        for(var i=0; i<data.length; i++){
                            var item = data[i];
                            Util.outputLog(_model, "show cmd history[" + i + "]:" + item.user_id
                                           + "," + item.status_id, false);
                        }
                    }
                }
            }

            // コマンド履歴のクリア
            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Clear Cmd history"
                onClicked: {
                    if(_userId.text.length > 0){
                        Util.outputDebugString("clear comamnd history");

                        Database.clearCommandHistory(_userId.text);
                        Util.outputLog(_model, "clear cmd history:" + _userId.text, false);
                    }
                }
            }

        }

        // テーブル削除
        Row{
            spacing: 4

            CheckBox{
                id: _enableDrop
                fontPointSize: fontSize
                text: "Enable drop"
                checked: false
            }

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Drop keyword"
                onClicked: {
                    if(_enableDrop.checked){
                        Util.outputDebugString("Drop keyword");
                        Database.dropKeyword();
                        Util.outputLog(_model, "drop:keyword", false);
                    }
                }
            }

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Drop history"
                onClicked: {
                    if(_enableDrop.checked){
                        Util.outputDebugString("drop history");
                        Database.dropHistory();
                        Util.outputLog(_model, "drop:history", false);
                    }
                }
            }

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Drop setting"
                onClicked: {
                    if(_enableDrop.checked){
                        Util.outputDebugString("drop setting");

                        Database.dropSetting();
                        Util.outputLog(_model, "drop:setting", false);
                    }
                }
            }

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Drop users"
                onClicked: {
                    if(_enableDrop.checked){
                        Util.outputDebugString("drop users");

                        Database.dropUserList();
                        Util.outputLog(_model, "drop:users", false);
                    }
                }
            }

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                color: clearBtnFontColor
                text: "Drop cmd history"
                onClicked: {
                    if(_enableDrop.checked){
                        Util.outputDebugString("drop command history");

                        Database.dropCommandHistory();
                        Util.outputLog(_model, "drop:command history", false);
                    }
                }
            }
        }

        // Twitter認証
        Row{
            spacing: 4

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Get Pin"
                onClicked: {
                    Util.outputDebugString("get pin");
                    TwitterAPI.startOAuth();
                }
            }

            TextBox{
                id: _pin
                width: _root.width / parent.children.length
            }

            Button{
                width: _root.width / parent.children.length
                font.pointSize: fontSize
                text: "Auth"
                onClicked: {
                    if(_pin.text.length > 0){
                        Util.outputDebugString("auth");

                        TwitterAPI.requestAuthorization(_pin.text, responseOAuth);
                    }
                }
                function responseOAuth(result){
                    Util.outputLog(_model, "auth:" + result, false);
                }
            }
        }

    }

    // ログに出力
//    function Util.outputLog(_model, text, false){
//        var now_string = Qt.formatDateTime(new Date(), "yyyy-MM-dd hh:mm:ss");
//        _model.append({"_message": now_string + " > " + text});
//    }


    // リストビューのデータ操作用エレメント
    ListModelManager{
        id: _model
        model: _list.model
    }

    // リストの初期アイテム
    ListModel{
        id: _listModel
//        ListElement{
//            _message: "Log..."
//        }
    }
    // リスト用レイアウト
    Component{
        id: _delegate
        Rectangle {
            width: _root.width
            height: _text.paintedHeight * 2
            border.color: "#555555"
            border.width: 1
            Text{
                id: _text
                anchors.verticalCenter: parent.verticalCenter
                anchors.left: parent.left
                anchors.leftMargin: 10
                text: _message
            }
        }

    }
    // リスト
    ListView{
        id: _list
        anchors.top: _btn.bottom
        anchors.left: _root.left
        anchors.right: _root.right
        anchors.bottom: _root.bottom
        clip: true
        model: _listModel
        delegate: _delegate

        onCountChanged: {
            positionViewAtEnd();
        }
    }
}
